home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 1996 September & October
/
Amiga-CD 1996 #9-10.iso
/
ausgabe_9_96
/
grafik
/
amipeg05
/
chunky2planar.s
< prev
next >
Wrap
Text File
|
1994-04-22
|
10KB
|
602 lines
;
; This source handles the conversion from 24-bit data to HAM8, initialization
; of the screen and so on.
;
; Support for Kaiko is not yet build-in, but very easy to accomplish, as it
; makes flush_cunkyloop completely obsolete. Looking forward to see
; custom logic like this, possibly more flexible, built-in in all Amigas.
;
; Phew! This one consumes 43% of the overall processor time in hires, 33% in
; lores. I want this Kaiko thingy!
;
;
; Michael Rausch 14-4-94 1:15:00
;
SECTION text,CODE
include "graphics/rastport.i"
include "graphics/gfx.i"
XREF _max_x
XREF _max_y
XDEF @HAM6_Init_lores
@HAM6_Init_lores:
movem.l d2-d7/a2-a6,-(sp)
; RGBG BRGB R=8 G=C B=4
P7 set %0111
P8 set %1101
move.l #(P7<<28)|(P7<<24)|(P7<<20)|(P7<<16)|(P7<<12)|(P7<<8)|(P7<<4)|P7,d5
move.l #(P8<<28)|(P8<<24)|(P8<<20)|(P8<<16)|(P8<<12)|(P8<<8)|(P8<<4)|P8,d6
move.l a0,HAM8_rastport
move.l (rp_BitMap,a0),a0
moveq #0,d1
move.w (bm_BytesPerRow,a0),d1
move.l d1,HAM8_offset ; we have advanced one complete line when accessing this
lea (bm_Planes,a0),a6
move.l a6,HAM8_screen
move.l (a6)+,a1
move.l (a6)+,a2
move.l (a6)+,a3
move.l (a6)+,a4
move.l (a6)+,a5
move.l (a6),a6
moveq.l #0,d4
lsr.l #2,d1 ; longs
subq.l #1,d1
move.w (bm_Rows,a0),d0
subq.w #1,d0
h6_prep_rows:
move.l d1,d2
h6_prep_nulls:
move.l d4,(a1)+
move.l d4,(a2)+
move.l d4,(a3)+
move.l d4,(a4)+
move.l d5,(a5)+
move.l d6,(a6)+
dbra d2,h6_prep_nulls
dbra d0,h6_prep_rows
movem.l (sp)+,d2-d7/a2-a6
rts
XDEF @HAM8_Init_lores
@HAM8_Init_lores:
movem.l d2-d7/a2,-(sp)
; RGBG BRGB R=8 G=C B=4
P7 set %0111
P8 set %1101
move.l #(P7<<28)|(P7<<24)|(P7<<20)|(P7<<16)|(P7<<12)|(P7<<8)|(P7<<4)|P7,d5
move.l #(P8<<28)|(P8<<24)|(P8<<20)|(P8<<16)|(P8<<12)|(P8<<8)|(P8<<4)|P8,d6
bra.s ham8cont
XDEF @HAM8_Init
@HAM8_Init: ; init from rastport data
movem.l d2-d7/a2,-(sp)
; BRGB R=8 G=C B=4
P7 set %1011
P8 set %0110
move.l #(P7<<28)|(P7<<24)|(P7<<20)|(P7<<16)|(P7<<12)|(P7<<8)|(P7<<4)|P7,d5
move.l #(P8<<28)|(P8<<24)|(P8<<20)|(P8<<16)|(P8<<12)|(P8<<8)|(P8<<4)|P8,d6
ham8cont:
bsr std_init
prep_rows:
move.l d1,d2
prep_nulls:
move.l d4,(a1)+
move.l d4,(a1)+
move.l d4,(a1)+
move.l d4,(a1)+
move.l d4,(a1)+
move.l d4,(a1)+
dbra d2,prep_nulls
move.l a1,a0
add.l a2,a0
move.l d1,d2
lsr.l #1,d2 ; ohoh
prep_cols67:
move.l d5,(a1)+
move.l d5,(a1)+
move.l d6,(a0)+
move.l d6,(a0)+
dbra d2,prep_cols67
add.l a2,a1
dbra d0,prep_rows
movem.l (sp)+,d2-d7/a2
rts
XDEF @HAM8_Init_x3
@HAM8_Init_x3: ; init from rastport data
movem.l d2-d7/a2-a3,-(sp)
bsr.s std_init
prep_rows_3:
move.l d1,d2
prep_nulls_3:
move.l d4,(a1)+
move.l d4,(a1)+
move.l d4,(a1)+
move.l d4,(a1)+
move.l d4,(a1)+
move.l d4,(a1)+
dbra d2,prep_nulls_3
move.l a1,a0
add.l a2,a0
lea (scale3tab1,pc),a3
move.l d1,d2
prep_cols67_3:
move.l (scale3tab2-scale3tab1,a3),(a0)+
move.l (a3)+,(a1)+
subq.w #1,d2
bmi.s pc67_ready_3
move.l (scale3tab2-scale3tab1,a3),(a0)+
move.l (a3)+,(a1)+
subq.w #1,d2
bmi.s pc67_ready_3
move.l (scale3tab2-scale3tab1,a3),(a0)+
move.l (a3)+,(a1)+
sub.w #3*4,a3
dbra d2,prep_cols67_3
pc67_ready_3:
add.l a2,a1
dbra d0,prep_rows_3
movem.l (sp)+,d2-d7/a2-a3
rts
; BRG R=8 G=C B=4
P7 set %101
P8 set %011
scale3tab1:
dc.l (P7<<29)|(P7<<26)|(P7<<23)|(P7<<20)|(P7<<17)|(P7<<14)|(P7<<11)|(P7<<8)|(P7<<5)|(P7<<2)|(P7>>1)
dc.l (P7<<31)|(P7<<28)|(P7<<25)|(P7<<22)|(P7<<19)|(P7<<16)|(P7<<13)|(P7<<10)|(P7<<7)|(P7<<4)|(P7<<1)|(P7>>2)
dc.l (P7<<30)|(P7<<27)|(P7<<24)|(P7<<21)|(P7<<18)|(P7<<15)|(P7<<12)|(P7<<9)|(P7<<6)|(P7<<3)|P7
scale3tab2:
dc.l (P8<<29)|(P8<<26)|(P8<<23)|(P8<<20)|(P8<<17)|(P8<<14)|(P8<<11)|(P8<<8)|(P8<<5)|(P8<<2)|(P8>>1)
dc.l (P8<<31)|(P8<<28)|(P8<<25)|(P8<<22)|(P8<<19)|(P8<<16)|(P8<<13)|(P8<<10)|(P8<<7)|(P8<<4)|(P8<<1)|(P8>>2)
dc.l (P8<<30)|(P8<<27)|(P8<<24)|(P8<<21)|(P8<<18)|(P8<<15)|(P8<<12)|(P8<<9)|(P8<<6)|(P8<<3)|P8
std_init:
move.l a0,HAM8_rastport
move.l (rp_BitMap,a0),a0
moveq #0,d1
move.w (bm_BytesPerRow,a0),d1
move.l (bm_Planes,a0),a1
move.l a1,HAM8_screen
move.l (bm_Planes+4,a0),a2
sub.l a1,a2 ; plane delta
cmp.l a2,d1
bgt.s check_interleaved
sub.l a2,a2 ; RED ALERT, no interlaved bitmap or strange, weirdo layout!
check_interleaved:
move.l a2,HAM8_next
move.l d1,HAM8_offset ; we have advanced one complete line when accessing this
moveq.l #0,d4
move.l a2,d1
lsr.l #2,d1 ; longs
subq.l #1,d1
move.w (bm_Rows,a0),d0
subq.w #1,d0
rts
********************************************************
XDEF @HAM6_draw_lores ; (data=a0, x=d0, y=d1)
@HAM6_draw_lores:
movem.l d2-d7/a2-a4,-(sp)
move.l _max_y(a4),d7
cmp.l d7,d1
bge.s h6_max128lores
move.l d1,d7 ; height
h6_max128lores:
subq.l #1,d7
move.l _max_x(a4),d1
cmp.l d1,d0
bge.s h6_max160lores
move.l d0,d1 ; width
h6_max160lores:
move.l d1,d6
lsr.w #4,d6
subq.w #1,d6 ; width in 8 pixel chunks
and.w #$fff0,d1 ; correct eol of over-large pix
sub.l d1,d0
move.l d0,d2 ; this is some quick fix for 360 pixels wide b0.mpg, which is invalid!
and.w #8,d2
add.w d2,d0
add.l d0,d0 ; 1 word per pixel
move.l d0,line_offset
move.l HAM8_screen,a1
addq.l #4,a1
move.l (a1)+,a2
move.l (a1)+,a3
move.l (a1),a4
move.l -12(a1),a1
move.l HAM8_offset,d2
move.l d6,d0
addq.l #1,d0
lsl.l #2,d0 ; writing one long per main loop
sub.l d0,d2
move.l d2,draw_offset
h6_draw_all_rows_lores:
move.l d7,-(sp)
move.l d6,d5
h6_blocks_loop_lores:
moveq #7,d4
h6_flush_chunkyloop_lores:
move.w (a0)+,d7 ; RGBG
rept 4
add.w d7,d7
addx.l d0,d0
add.w d7,d7
addx.l d1,d1
add.w d7,d7
addx.l d2,d2
add.w d7,d7
addx.l d3,d3
endr
dbra d4,h6_flush_chunkyloop_lores
move.l d3,(a1)+
move.l d2,(a2)+
move.l d1,(a3)+
move.l d0,(a4)+
dbra d5,h6_blocks_loop_lores
add.l line_offset,a0
; move.l draw_offset,d1
; add.l d1,a1
; add.l d1,a2
; add.l d1,a3
; add.l d1,a4
move.l (sp)+,d7
dbra d7,h6_draw_all_rows_lores
movem.l (sp)+,d2-d7/a2-a4
rts
********************************************************
XDEF @HAM8_draw_lores ; (data=a0, x=d0, y=d1)
@HAM8_draw_lores:
movem.l d2-d7/a2-a6,-(sp)
move.l _max_y(a4),d7
cmp.l d7,d1
bge.s max128lores
move.l d1,d7 ; height
max128lores:
subq.l #1,d7
move.l _max_x(a4),d1
cmp.l d1,d0
bge.s max160lores
move.l d0,d1 ; width
max160lores:
move.l d1,d6
lsr.w #4,d6
subq.w #1,d6 ; width in 8 pixel chunks
and.w #$fff0,d1 ; correct eol of over-large pix
sub.l d1,d0
move.l d0,d2 ; this is some quick fix for 360 pixels wide b0.mpg, which is invalid!
and.w #8,d2
add.w d2,d0
add.l d0,d0 ; 1 word per pixel
move.l d0,line_offset
move.l HAM8_screen,a1 ; get addr, prep next line
move.l HAM8_next,d1
move.l a1,a2
add.l d1,a2
move.l a2,a3
add.l d1,a3
move.l a3,a4
add.l d1,a4
move.l a4,a5
add.l d1,a5
move.l a5,a6
add.l d1,a6
move.l HAM8_offset,d2
move.l d6,d0
addq.l #1,d0
lsl.l #2,d0 ; writing one long per main loop
sub.l d0,d2
move.l d2,draw_offset
draw_all_rows_lores:
move.l d7,-(sp)
move.l d6,-(sp)
blocks_loop_lores:
move.l d6,-(sp)
moveq #7,d6
flush_chunkyloop_lores:
move.l (a0)+,d7 ; RGBG
add.l d7,d7
addx.l d0,d0
add.l d7,d7
addx.l d1,d1
add.l d7,d7
addx.l d2,d2
add.l d7,d7
addx.l d3,d3
add.l d7,d7
addx.l d4,d4
add.l d7,d7
addx.l d5,d5
rept 3
lsl.l #3,d7
addx.l d0,d0
add.l d7,d7
addx.l d1,d1
add.l d7,d7
addx.l d2,d2
add.l d7,d7
addx.l d3,d3
add.l d7,d7
addx.l d4,d4
add.l d7,d7
addx.l d5,d5
endr
dbra d6,flush_chunkyloop_lores
move.l d5,(a1)+
move.l d4,(a2)+
move.l d3,(a3)+
move.l d2,(a4)+
move.l d1,(a5)+
move.l d0,(a6)+
move.l (sp)+,d6
dbra d6,blocks_loop_lores
add.l line_offset,a0
move.l draw_offset,d1
add.l d1,a1
add.l d1,a2
add.l d1,a3
add.l d1,a4
add.l d1,a5
add.l d1,a6
move.l (sp)+,d6
move.l (sp)+,d7
dbra d7,draw_all_rows_lores
movem.l (sp)+,d2-d7/a2-a6
rts
********************************************************
XDEF @HAM8_draw_hires ; (data=a0, x=d0, y=d1)
@HAM8_draw_hires:
movem.l d2-d7/a2-a6,-(sp)
move.l _max_y(a4),d7
cmp.l d7,d1
bge.s max128
move.l d1,d7 ; height
max128: subq.l #1,d7
move.l _max_x(a4),d1
cmp.l d1,d0
bge.s max160
move.l d0,d1 ; width
max160:
move.l d1,d6
lsr.w #3,d6
subq.w #1,d6 ; width in 8 pixel chunks
and.w #$fff8,d1 ; correct eol of over-large pix
sub.l d1,d0
lsl.l #2,d0 ; 1 long per pixel
move.l d0,line_offset
move.l HAM8_screen,a1 ; get addr, prep next line
move.l HAM8_next,d1
move.l a1,a2
add.l d1,a2
move.l a2,a3
add.l d1,a3
move.l a3,a4
add.l d1,a4
move.l a4,a5
add.l d1,a5
move.l a5,a6
add.l d1,a6
move.l HAM8_offset,d2
move.l d6,d0
addq.l #1,d0
lsl.l #2,d0
sub.l d0,d2
move.l d2,draw_offset
draw_all_rows:
move.l d7,-(sp)
move.l d6,-(sp)
blocks_loop:
move.l d6,-(sp)
moveq #7,d6
flush_chunkyloop:
move.l (a0)+,d7 ; BRG0
add.l d7,d7
addx.l d0,d0
add.l d7,d7
addx.l d1,d1
add.l d7,d7
addx.l d2,d2
add.l d7,d7
addx.l d3,d3
add.l d7,d7
addx.l d4,d4
add.l d7,d7
addx.l d5,d5
rept 2
lsl.l #3,d7
addx.l d0,d0
add.l d7,d7
addx.l d1,d1
add.l d7,d7
addx.l d2,d2
add.l d7,d7
addx.l d3,d3
add.l d7,d7
addx.l d4,d4
add.l d7,d7
addx.l d5,d5
endr
add.l d0,d0
add.l d1,d1
add.l d2,d2
add.l d3,d3
add.l d4,d4
add.l d5,d5
dbra d6,flush_chunkyloop
move.l #$11111111,d6
copcol macro (reg)
move.l \1,d7
lsr.l #3,d7 ; BRGB
and.l d6,d7
or.l d7,\1
endm
copcol d0
copcol d1
copcol d2
copcol d3
copcol d4
copcol d5
move.l d5,(a1)+
move.l d4,(a2)+
move.l d3,(a3)+
move.l d2,(a4)+
move.l d1,(a5)+
move.l d0,(a6)+
move.l (sp)+,d6
dbra d6,blocks_loop
add.l line_offset,a0
move.l draw_offset,d1
add.l d1,a1
add.l d1,a2
add.l d1,a3
add.l d1,a4
add.l d1,a5
add.l d1,a6
move.l (sp)+,d6
move.l (sp)+,d7
dbra d7,draw_all_rows
movem.l (sp)+,d2-d7/a2-a6
rts
********************************************************
SECTION __MERGED,BSS
HAM8_rastport: ds.l 1 ; original rastport struct
HAM8_screen: ds.l 1 ; first bitplane
HAM8_offset: ds.l 1 ; next line in the first bitplane
HAM8_next: ds.l 1 ; next bitplane
draw_offset: ds.l 1
line_offset: ds.l 1
is_interleaved: ds.w 1
END